package cn.dengta.webapp.im.service;

import java.util.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import cn.dengta.common.context.Env;
import cn.dengta.common.model.Messager;
import cn.dengta.common.model.TimeInterval;
import cn.dengta.context.model.Language;
import cn.dengta.context.model.Member;
import cn.dengta.webapp.ai.entity.Ai;
import cn.dengta.webapp.im.dto.*;
import cn.dengta.webapp.trade.model.ScenesType;
import cn.dengta.webapp.user.entity.User;
import cn.dengta.webapp.user.form.query.UserOnlineQuery;
import cn.dengta.webapp.user.vo.UserOnlineVO;
import org.apache.commons.lang3.StringUtils;

public interface RemoteImService {

	/** 本系统在云信的官方号ID："f21032908" */
	Long SYSTEM_USER_ID = 8L;
	/** 本系统在云信的官方客服号 ID："f21033009" */
	Long SYSTEM_SERVICE_ID = 9L;

	/** 平台超管号用户ID集合 */
	Set<Long> SYSTEM_SUPERVISOR_USER_IDS = Set.of(1L, 2L, 3L);

	static String toAccid(Long userId) {
		return Member.encode(userId);
	}

	static String envAiPrefix() {
		return "a" + switch (Env.CURRENT) {
			case PROD -> "p";
			case UAT -> "u";
			case TEST -> "t";
			default -> "d";
		};
	}

	static String toAiIdAccid(Long aiId) {
		return envAiPrefix() + aiId;
	}

	static Long parseAiId(String accid) {
		return Long.parseLong(StringUtils.replace(accid, envAiPrefix(), ""));
	}

	static boolean isAiId(String accid) {
		return StringUtils.startsWith(accid, envAiPrefix());
	}

	static Long parseUserId(String accid) {
		return Member.decode(accid);
	}

	/**
	 * 获取指定用户的云信 Token
	 */
	Messager<String> getToken(User user);

	/**
	 * 更新用户名片
	 */
	Messager<String> updateUserInfo(User user);

	/**
	 * 赠送礼物
	 */
	Messager<String> sendGift(GiftMsgDTO dto);

	/**
	 * 发送云信消息
	 */
	Messager<String> sendMsg(Long fromUserId, String msg, Long toUserId);

	/**
	 * 发送云信消息
	 */
	Messager<String> sendMsg(String fromUserId, String msg, String toUserId);

	/**
	 * 发送云信系统消息
	 */
	Messager<String> sendSystemMsg(String msg, Long toUserId);

	/**
	 * 发送云信系统消息
	 *
	 * @param dto 信息
	 * @param excMsg 扩展信息
	 * @param toUserId 接收人
	 * @param toUserLang 接收语言
	 */
	Messager<String> sendSystemMsg(SystemNotifyDTO dto, String excMsg, Long toUserId, Language toUserLang);

	Messager<String> sendGroupVipMsg(Long toUserId, String msg);

	/**
	 * 发送云信 系统通知消息
	 */
	Messager<String> sendSystemNotify(Long toUserId, String msg, SystemNotifyDTO notifyDTO);

	/**
	 * 发送云信 系统通知消息
	 */
	Messager<String> sendSystemNotify(Long userId, Long toUserId, String msg, SystemNotifyDTO dto);

	/**
	 * 发送云信客服消息
	 */
	Messager<String> sendServiceMsg(String msg, Long toUserId, @Nullable Language toUserLang);

	/**
	 * 批量发送云信系统消息
	 */
	Messager<String> sendBatchSystemMsg(String msg, List<Long> toUserIds);

	Messager<String> sendBatchSystemMsg(String msg, String toUserIds);

	/**
	 * 批量发送云信系统消息
	 *
	 * @param imgUrl 图片链接
	 * @param toUserIds 接收方用户ID
	 */
	Messager<String> sendBatchSystemImgMsg(String imgUrl, String toUserIds);

	/**
	 * 批量发送系统通知
	 */
	Messager<String> sendBatchNotify(String msg, Long toUserId, List<Long> toUserIds, SystemNotifyDTO dto);

	/**
	 * 返回两个用户是否已搭讪过
	 */
	boolean hasGreeted(@Nonnull Long userId, @Nonnull Long toUserId);

	/**
	 * 返回 {@code toUserIds } 中与 指定用户 搭讪过的用户 ID Set集合
	 *
	 * @param userId 指定用户
	 */
	@Nonnull
	Set<Long> findGreetedUserIds(Long userId, @Nonnull Long... toUserIds);

	/**
	 * 修改搭讪记录状态
	 */
	void updateStatus(Long id, Integer status);

	/**
	 * 封禁或解封云信账号（先封禁强制退出，再解封）
	 */
	void block(Long userId, boolean blockOrUnblock);

	/**
	 * 查询在线时长范围数据
	 */
	Map<Long, UserOnlineVO> findOnlineTimeByUserId(@Nonnull TimeInterval addTimeInterval, @Nonnull TimeInterval loginTimeInterval, UserOnlineQuery query);

	void cashGuide(Long userId);

	void addGiftClickCount(String eventName, Long giftId, Integer success);

	/** 充值事件 */
	void rechargeEvent(ScenesType event, Long giftId, boolean isSuccess);

	Messager<String> sendCardCustomMsg(Long formUserId, Long userId, CardMsgDTO cardMsg);

	/** 添加云信好友 */
	Messager<String> addFriend(Long formUserId, Long toUserId);

	/** 更新云信好友备注 */
	Messager<String> updateFriend(Long formUserId, Long toUserId, String alias);

	/** 创建AI 云信账户 */
	Messager<String> createAi(Ai ai);

	/** 更新AI 云信信息 */
	Messager<String> updateAiInfo(Ai ai);

}
